/* $Id: main.prg,v 1.0 2008/10/23 14:44:02 riztan Exp $*/
/*
	Copyright © 2008  Riztan Gutierrez <riztang@gmail.com>

   Este programa es software libre: usted puede redistribuirlo y/o modificarlo 
   conforme a los términos de la Licencia Pública General de GNU publicada por
   la Fundación para el Software Libre, ya sea la versión 3 de esta Licencia o 
   (a su elección) cualquier versión posterior.

   Este programa se distribuye con el deseo de que le resulte útil, pero 
   SIN GARANTÍAS DE NINGÚN TIPO; ni siquiera con las garantías implícitas de
   COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO DETERMINADO. Para más información, 
   consulte la Licencia Pública General de GNU.

   http://www.gnu.org/licenses/
*/

/** \file main.prg.
 *  \brief Programa Inicial  
 *  \author Riztan Gutierrez. riztan@gmail.com
 *  \date 2008
 *  \remark Donde comienza la historia...
*/

/** \mainpage Archivo Principal (index.html)
 *
 * \section intro_sec Introduccion
 *
 * Esta es la introducción.
 *
 * \section install_sec Instalacion
 *
 * \subsection step1 Paso 1: Inicializando Variables
 *
 * etc...
 */

#include "proandsys.ch"
#include "gclass.ch"
#include "tgtkext.ch"
#include "tip.ch"

// #include "hbstruct.ch"
// #include "hblang.ch"


// GLOBAL oTepuy  /** \var GLOBAL oTepuy. Objeto Principal oTepuy. */

memvar oTepuy

// memvar oMsgRun_oLabel, oMsgRun_oImage

REQUEST HB_LANG_ES
REQUEST FIS_StrXOR
REQUEST FIS_ErrStr
REQUEST FIS_SendCmd
REQUEST HexToStr
REQUEST StrToHex
REQUEST StruToGType
REQUEST Run2Me
REQUEST CSV2Array
REQUEST ValidMail
REQUEST TPYENTRY

/** \brief Inicio. Donde comienza todo.
 */
Function Main( uPar1, uPar2, uPar3, uPar4)

   Local oWnd, oWnd2, oAcerca_de, cResource
   Local cVersion:="0.1 (Alfa)"
   Local cSystem_Name:=TEPUY_NAME+" v"+cVersion

   Local nValor := ROUND(SECONDS()+50,0)

   Default uPar1 := "", uPar2 := "", uPar3 := "", uPar4 := ""

   // Public oMsgRun_oLabel, oMsgRun_oImage
   Public oApp,oTepuy

   CLOS ALL
   SET DELE ON
   SET WRAP ON
   SET SCOR OFF
   SET BELL OFF
   SET SOFT ON
   SET EXCL OFF
   SET DECI TO 2
   SET DATE FORMAT TO TPY_DATEFORMAT
   SET CENTURY ON
   SET EPOCH TO ( YEAR( DATE() ) - 50 )
   SET Delete On

   HB_LANGSELECT("ES")

//   SET CENTURY ON
//   SET DATE ITALIAN
//   SET EXACT ON   // No se porque... pero esto falla con los script.
//   SET DECIMALS TO 2
   SET CONFIRM ON

   oTepuy := TApp():New()

   oTepuy:cVersion    :=cVersion
   oTepuy:cSystem_Name:=cSystem_Name
   oTepuy:lSalir := .F.
   oTepuy:l_gnome_db_init := .F.

   /*
     Definicion de Timer General
     Desconozco por los momentos el porque si activo una ventana antes que el
     timer... éste luego no funciona.
   */
   DEFINE TIMER oTepuy:oTimer;
          INTERVAL 100;
   	    ACTION nValor := TestTimer(nValor);

   ACTIVATE TIMER oTepuy:oTimer

/*
 * Lo primero es intentar conectar a la base de datos para tomar 
 * las configuraciones iniciales 
 * 
*/

   oTepuy:aTabs_Main := { TP_TABLE_MAIN, TP_TABLE_ENTITY }
   oTepuy:cMainSchema:= Alltrim(TEPUY_SCHEMA)+"."
   oTepuy:cImages    := "./images/"
   oTepuy:cResources := "./resources/"
   oTepuy:cTablas    := "./tables/"
   oTepuy:cIncludes  := "./include/"
   oTepuy:cXBScripts := "./xbscripts/"
   oTepuy:cSQLScr    := "./sql/"
   oTepuy:cDocs      := "./doc/"
   oTepuy:cTemps     := "./.tmp/"

   oTepuy:cResource  := ""
   oTepuy:cIconMain  := oTepuy:cImages+"logo_proandsys_64x64.png"
   oTepuy:cRsrcMain  := oTepuy:cResources+"proandsys.glade"

   oTepuy:cPassword  := "Sarisariñama"
   
   //-- Modo Debug
   oTepuy:lDebug     := .T.  // Activa o Desactiva en View()
   
   IF File( uPar1 )

      IF "SAVE" IN UPPER( uPar2 ) 
         SaveScript(uPar1, MEMOREAD(uPar1) ,;
                           IIF( UPPER(uPar2)="SAVEEXEC",.T.,.F. ) )
         oTepuy:Release()
         CLEAR ALL
         Quit
      ENDIF

      oTepuy:RunXBS(uPar1)
      oTepuy:Release()
      Quit

   ENDIF
   
   oTepuy:aConnection:= {}
   oTepuy:oConnections:= TPublic():New()

   /* Verificamos la existencia del archivo connections.xml */
   oTepuy:oXmlConnections := LoadXML( oTepuy:cTemps+FILE_CONNECTIONS )
   
   If !HB_ISNIL( oTepuy:oXmlConnections )
   
      /* Realizar Apertura de Conexiones Configuradas... */
            
      oTepuy:RunXBS('autologin')
      /* Guardamos la configuracion actual por si acaso...  */
      oTepuy:nFileHandle := FCreate( oTepuy:cTemps+FILE_CONNECTIONS_BACKUP )
      oTepuy:oXmlConnections:write( oTepuy:nFileHandle, HBXML_STYLE_INDENT )
      FClose( oTepuy:nFileHandle )

      oTepuy:Del( "nFileHandle" )
      
   Else
   
      oTepuy:RunXBS('login')
      
   Endif
   
   // No se porque, pero si se define el recurso antes de 
   // activar el timer, el timer no funciona
   // SET RESOURCES oTepuy:cResource FROM FILE oTepuy:cRsrcMain 

/*
 * Por lo pronto este login ya no es necesario.

   oTepuy:oLastLogin := LoadLogin()   // Lectura de login.xml
   
   If oTepuy:oLastLogin == NIL
      oTepuy:cHost    := "localhost"
      oTepuy:nPort    := 5432       
      oTepuy:cDb      := "auyante"  
      oTepuy:cUser    := "postgres" 
      oTepuy:cSavePass:= "F"        
   Else
      oTepuy:cHost    :=     oTepuy:oLastLogin:aAttributes["host"     ]
      oTepuy:nPort    := Val(oTepuy:oLastLogin:aAttributes["port"     ])
      oTepuy:cDb      :=     oTepuy:oLastLogin:aAttributes["database" ]
      oTepuy:cUser    :=     oTepuy:oLastLogin:aAttributes["user"     ]
      oTepuy:cPass    :=     oTepuy:oLastLogin:aAttributes["password" ]
      oTepuy:cSavePass:=     oTepuy:oLastLogin:aAttributes["save_pass"]
//      oTepuy:cSavePass:= "F"
   EndIf
   

   // Login.
   If !gui_login()
      oTepuy:End()
      Quit
   EndIf
*/   
   

//   MemoToXML() // Guardamos los valores de conexion.

   IF !( oTepuy:RunXBS('begin') )
//      Salir( .T. )
   EndIf

/*
   SET RESOURCES oTepuy:cResource FROM FILE oTepuy:cRsrcMain 
   DEFINE WINDOW oTepuy:oWnd ID "main" RESOURCE oTepuy:cResource ;
          TITLE cSystem_Name ;
          ICON_FILE oTepuy:cIconMain

          DEFINE TOOLBUTTON ID "toolbutton1" RESOURCE oTepuy:cResource;
                 ACTION ( TestTimer() )

          DEFINE TOOLBUTTON ID "toolbutton2" RESOURCE oTepuy:cResource;
                 ACTION ( FileChooser() )

          DEFINE MENUITEM oTepuy:oAcerca_de;
                 ACTION Acerca_de();
                 ID "acerca_de";
                 RESOURCE oTepuy:cResource 

          DEFINE MENUITEM  ;
                 ACTION Salir() ;
                 ID "mmain_salir";
                 RESOURCE oTepuy:cResource

   ACTIVATE WINDOW oTepuy:oWnd;
            VALID Salida()
*/
Return NIL



/** \brief Realiza la Salida del Sistema
 */
Function Salida( lForce )

   DEFAULT lForce := .F.

   oTepuy:Exit( lForce )
   
Return .F.



/** \brief Realiza la Salida del Sistema
 */
Function Salir( lForce )

   Default lForce := .F.
   
   If Salida( lForce )

      TRY
         PQClose(oTepuy:conn)
      CATCH
      END

      IF oTepuy:oWnd != NIL
         oTepuy:oWnd:End()
      ENDIF
      oTepuy:End()
      gtk_main_quit()
      Quit
      Return .F.

   EndIf

Return .T.



/** \brief Test para Timer. (Funcion Provisional)
 */
Function TestTimer(nValor)

   Local oWnd, oRun, oLabel, oBox, i, z

   DEFAULT nValor := 0

   If HB_ISNIL(oTepuy:oWnd)
      Return ROUND(SECONDS()+10,0)
   EndIf

/*
   CLEAR SCRE
   @ 0, 0  SAY "Monitor de Timer"
   @ 2, 0  SAY  nValor 
   @ 3, 0  SAY  ROUND(SECONDS(),0)
*/
   If nValor <= ROUND(SECONDS(),0) .AND. !Empty( oTepuy:oWnd )

// --- Esto es una prueba del Timer.
//      MsgRun("MessageRun ", {||MsgInfo("pausa")} )
      oTepuy:oWnd:SetTitle( "Ejecutado Timer... "+CStr(Time()) )
    

      nValor := ROUND(SECONDS()+10,0)

   Endif

Return nValor



Function FileChooser(nMode, cType )

   Local oFileChooser, cFile, cDialog
   Local cPath, cAction
   
   Default nMode := GTK_FILE_CHOOSER_ACTION_OPEN
   Default cType := "XBS"

   DO CASE 
      CASE cType = "XBS"
         cPath   := "/xbscripts/*.xbs"
         cAction := "oTepuy:OpenXBS(cFile)"
      CASE cType = "SQL"
         cPath   := "/sql/*.sql"
         cAction := "OpenSQL(cFile)"
   ENDCASE
   
   SET RESOURCES oTepuy:cResource FROM FILE oTepuy:cRsrcMain 

//   MsgInfo( CStr(OSDRIVE() + "/" +CurDir()+"/xbscripts/") )

   If nMode = GTK_FILE_CHOOSER_ACTION_OPEN
      cDialog := "filechooserdialog0"
   Else
      cDialog := "filechooserdialog1"
   EndIf
      DEFINE FILECHOOSERBUTTON oFileChooser ID cDialog ;
          RESOURCE oTepuy:cResource;
          PATH_INIT OSDRIVE() + "/" +CurDir()+cPath
          
//          oFileChooser:SetIconName("gtk_preferences")

          DEFINE BUTTON ID "button_abrir" RESOURCE oTepuy:cResource;
                 ACTION (cFile:= oFileChooser:GetFileName(), oFileChooser:End(),;
                         IIF(cType = "XBS", oTepuy:OpenXBS(cFile), NIL ) )

          DEFINE BUTTON ID "button_cancelar" RESOURCE oTepuy:cResource;
                 ACTION oFileChooser:End()

    SysRefresh()

Return .T.


Function ChooserExec(nMode, cType )

   Local oFileChooser, cFile, cFileName, cDialog
   Local cPath, cAction

   Default nMode := GTK_FILE_CHOOSER_ACTION_OPEN
   Default cType := "PPO"

   cPath   := "/xbscripts/*.ppo"
   cAction := "oTepuy:RunXBS(cFile)"

   

   SET RESOURCES oTepuy:cResource FROM FILE oTepuy:cRsrcMain 

   If nMode = GTK_FILE_CHOOSER_ACTION_OPEN
      cDialog := "filechooserdialog0"
   Else
      cDialog := "filechooserdialog1"
   EndIf
      DEFINE FILECHOOSERBUTTON oFileChooser ID cDialog ;
          RESOURCE oTepuy:cResource;
          PATH_INIT OSDRIVE() + "/" +CurDir()+cPath

          DEFINE BUTTON ID "button_abrir" RESOURCE oTepuy:cResource;
                 ACTION ( cFile:= Token( Token(oFileChooser:GetFileName(),'/',; 
                          NumToken(oFileChooser:GetFileName(),'/') ) ,'.', 1 ),; 
                          oFileChooser:End(),;
                          oTepuy:RunXBS(cFile) )

          DEFINE BUTTON ID "button_cancelar" RESOURCE oTepuy:cResource;
                 ACTION oFileChooser:End()

    SysRefresh()

Return .T.


Function tpy_gnome_db_init()

   If !oTepuy:l_gnome_db_init
      gnome_db_init (oTepuy:cSystem_Name, oTepuy:cVersion)
      oTepuy:l_gnome_db_init := .T.
      Return .T.
   EndIf

Return .F.



Function tpy_gda_client()

   If !oTepuy:IsDef( "gda_client" ) .AND. tpy_gnome_db_init()
      oTepuy:Add("gda_client", gda_client_new() )
   EndIf

Return oTepuy:gda_client




Function SaveScript( cFile, cText, lExec, p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 )

   Local oInterpreter, cFilePPO
   Local oFile, oRun, lRet:=.F.

   Default cText := '' , lExec := .F.

   If RIGHT( lower(cFile) , 4 ) = '.xbs'

      cFilePPO := Left( cFile , LEN(cFile) - 4 ) + ".ppo"

      If File( cFilePPO  )

         If FErase( cFilePPO ) <> 0
            MsgStop( MSG_FILE_NO_DELETE , MSG_TITLE_ERROR )
            Return .F.
         EndIf

      EndIf

      oInterpreter := TInterpreter():New(cFile)

      oInterpreter:SetScript( cText, 1 , cFile )
      If !lExec
         oInterpreter:lExec:=.F.
      EndIf
      lRet := oInterpreter:Run( { p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 } )

      cText := ''

      AEVAL( oInterpreter:acPPed , {|a|                                  ;
                                     IIf( a <> NIL .AND. Left(a,1)<>"#", ;
                                         cText += a + CRLF , NIL )       ;
                                   } )

      //Escribiendo el pre-procesado
      
      oFile := gTextFile():New( cFilePPO, "W" )

      oFile:WriteLn( cText )

      oFile:Close()

      MsgInfo( "Generado "+ALLTRIM( cFilePPO ) ) 
   Else

      MsgStop( MSG_FILE_NO_ADEQUATE , MSG_FILE_NO_SAVE)

   EndIf

Return lRet


//EOF
